package cn.mujiankeji.mbrowser.界面.标签页

import android.inputmethodservice.Keyboard.Row
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import cn.mujiankeji.mbrowser.app.应用接口
import cn.mujiankeji.mbrowser.功能.下载.仓库.下载仓库接口
import cn.mujiankeji.mbrowser.功能.下载.模型.下载任务
import cn.mujiankeji.mbrowser.功能.下载.模型.下载状态
import cn.mujiankeji.mbrowser.界面.图标.MyIconPack
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.删除
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.加
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.播放
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.暂停
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.空箱子
import cn.mujiankeji.mbrowser.界面.框架.主视图.标签页状态
import kotlinx.coroutines.launch
import org.koin.compose.koinInject
import org.koin.core.context.GlobalContext
import org.koin.core.component.inject
import cn.mujiankeji.mbrowser.功能.下载.下载管理器接口
import cn.mujiankeji.mbrowser.工具.操作.地址操作
import cn.mujiankeji.mbrowser.界面.小窗页.文本编辑窗口状态
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.cancel

class 下载管理页面状态() : 标签页状态() {

    var coroutine : CoroutineScope ?= null
    var 下载管理器 = GlobalContext.get().get<下载管理器接口>()
    var 已完成列表 = mutableStateListOf<下载任务>()
    var 下载中任务 = mutableStateListOf<下载任务>()

    init {
        super.标题.value = "下载管理"
        super.地址.value = "mbrowser://download"
    }
    fun 请求创建下载(){
        文本编辑窗口状态(提示值 = {"请输入地址"}){
            it?.let {
                val url = 地址操作.取绝对地址(it)
                val name = 地址操作.取文件名(it,false)
                if (地址操作.是否有效URL(it) && name.isNotEmpty()){
                    应用接口.界面模块().viewModelScope.launch {
                        应用接口.下载(url,name)
                    }
                }
            }
        }
        // TODO: 实现创建下载的逻辑
    }

    // 暂停 or 继续
    fun 切换下载状态(item : 下载任务){
        coroutine?.launch {
            if (item.状态 == 下载状态.正在下载) {
                下载管理器.暂停下载(item.id)
            } else {
                下载管理器.恢复下载(item.id)
            }
        }
    }

    fun 删除项目(项目 : 下载任务,同时删除已下载文件 : Boolean){
        coroutine?.launch {
            下载管理器.暂停下载(项目.id)
            下载管理器.删除下载记录(项目.id,true)
        }
    }
}

@Composable
fun 下载管理页面实现(state : 下载管理页面状态){

    state.coroutine = rememberCoroutineScope()
    DisposableEffect(Unit) {
        onDispose {
            state.coroutine?.cancel()
            state.coroutine = null
        }
    }
    LaunchedEffect(Unit) {
        launch {
            state.下载管理器.获取活动下载任务Flow().collect{
                state.下载中任务.clear()
                state.下载中任务.addAll(it)
            }
        }
        launch {
            state.下载管理器.获取已完成下载任务Flow().collect{
                state.已完成列表.clear()
                state.已完成列表.addAll(it)
            }
        }
    }

    统一标签页布局(title = {"下载管理"},
        action = {
            IconButton({state.请求创建下载()}) {
                Icon(MyIconPack.加,"")
            }
        })
    {

        LazyColumn {
            item { Spacer(Modifier.height(10.dp)) }

            if (state.下载中任务.isEmpty()){
                // 没有内容
                item {
                    Box(Modifier.fillMaxWidth()
                        .height(150.dp),
                        contentAlignment = Alignment.Center){
                        Column(horizontalAlignment = Alignment.CenterHorizontally){
                            Icon(MyIconPack.空箱子,"",
                                tint = MaterialTheme.colorScheme.outline,
                                modifier = Modifier.size(36.dp))
                            Spacer(Modifier.height(10.dp))
                            Text("没有正在下载的内容",
                                style = MaterialTheme.typography.bodyMedium,
                                color = MaterialTheme.colorScheme.tertiary)
                        }
                    }
                }
            }
            else {
                items(state.下载中任务){
                    未完成项目(state,it)
                }
            }

            // 已完成
            if (state.已完成列表.isNotEmpty()){

                item {
                    Box(Modifier.fillMaxWidth()
                        .height(66.dp),
                        contentAlignment = Alignment.Center) {
                        Text("- 已完成 -", style = MaterialTheme.typography.labelMedium,
                            color = MaterialTheme.colorScheme.outline)
                    }
                }

                items(state.已完成列表){
                    已完成项目(state,it)
                }
            }
        }
    }
}

@Composable
private fun 已完成项目(state: 下载管理页面状态, item: 下载任务) {
    val scope = rememberCoroutineScope()
    Surface(
        tonalElevation = 1.dp,
        shape = MaterialTheme.shapes.medium,
        color = MaterialTheme.colorScheme.surfaceContainer,
        modifier = Modifier
            .fillMaxWidth()
            .padding(horizontal = 12.dp, vertical = 4.dp)
    ) {
        Row(
            Modifier
                .fillMaxWidth()
                .padding(horizontal = 12.dp, vertical = 10.dp),
            verticalAlignment = Alignment.CenterVertically
        ) {
            Column(Modifier.weight(1f)) {
                Text(item.文件名, style = MaterialTheme.typography.bodyLarge,
                    color = MaterialTheme.colorScheme.onSurface)
                item.完成时间?.let {
                    Text(
                        text = "已完成 · " + java.text.SimpleDateFormat("MM-dd HH:mm").format(it),
                        style = MaterialTheme.typography.labelSmall,
                        color = MaterialTheme.colorScheme.outline
                    )
                }
            }
            IconButton(onClick = {
                state.删除项目(item,false)
            }) {
                Icon(MyIconPack.删除, "删除", tint = MaterialTheme.colorScheme.outline)
            }
        }
    }
}

@Composable
private fun 未完成项目(state: 下载管理页面状态, item: 下载任务) {
    Surface(
        tonalElevation = 1.dp,
        shape = MaterialTheme.shapes.medium,
        modifier = Modifier
            .fillMaxWidth()
            .padding(horizontal = 10.dp, vertical = 5.dp),
    ) {
        Row(
            Modifier
                .fillMaxWidth()
                .background(MaterialTheme.colorScheme.surface)
                .padding(horizontal = 15.dp, vertical = 20.dp),
            verticalAlignment = Alignment.CenterVertically
        ) {
            Column(Modifier.weight(1f)) {
                Text(item.文件名, style = MaterialTheme.typography.titleMedium,
                    color = MaterialTheme.colorScheme.onSurface)
                val 状态文本 = when(item.状态) {
                    下载状态.等待中 -> "等待中"
                    下载状态.正在下载 -> "下载中"
                    下载状态.已暂停 -> "已暂停"
                    下载状态.失败 -> "失败"
                    else -> ""
                }

                Spacer(Modifier.height(3.dp))

                Row(Modifier.fillMaxWidth(),
                    verticalAlignment = Alignment.CenterVertically) {

                    Text(
                        text = "$状态文本  ${(item.已下载大小 / 1024 / 1024)}MB / ${(item.文件大小 / 1024 / 1024)}MB",
                        style = MaterialTheme.typography.labelMedium,
                        color = MaterialTheme.colorScheme.outline
                    )

                    Spacer(Modifier.weight(1f))

                    // 暂停/继续按钮
                    IconButton(onClick = {
                        state.切换下载状态(item)
                    }) {
                        val isPaused = item.状态 == 下载状态.已暂停
                        Icon(
                            if (isPaused) MyIconPack.播放 else MyIconPack.暂停,
                            if (isPaused) "继续" else "暂停",
                            tint = MaterialTheme.colorScheme.primary,
                            modifier = Modifier.size(16.dp)
                        )
                    }
                    // 删除按钮
                    IconButton(onClick = {
                        state.删除项目(item,true)
                    }) {
                        Icon(MyIconPack.删除, "删除",
                            tint = MaterialTheme.colorScheme.outline,
                            modifier = Modifier.size(16.dp))
                    }

                }

                Spacer(Modifier.height(12.dp))
                if (item.状态 == 下载状态.正在下载){
                    val 进度 = if (item.文件大小 > 0) item.已下载大小.toFloat() / item.文件大小 else 0f
                    androidx.compose.material3.LinearProgressIndicator(
                        progress = 进度,
                        modifier = Modifier
                            .fillMaxWidth()
                            .height(2.dp),
                        color = MaterialTheme.colorScheme.primary,
                        trackColor = MaterialTheme.colorScheme.surfaceVariant
                    )
                }


            }

        }
    }
}